<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>
    // 字面量对象(普通对象) => 特点: 可以对应属性名,对对象中的数据进行增删改查!!
     var zhang = { // new Object()
        name:"张三",
        age:18,
        height:"177cm",
        weight:"70kg",
    }


    // zhang.sex = "男"; // 对象赋值时,赋一个不存在的属性,就会新增
    // delete zhang.height;
    // delete zhang.weight;
    // zhang.name = "李四";

    // console.log(zhang);


    // 除字面量对象和构造函数以外, 还有其他方式可以定义对象的属性

    /* 
       构造函数Object的方法  
       Object.defineProperty(targetObj,key,desc)   给对象新增属性,同时配置该属性的相关信息 (此方式也可以修改现有的desc配置,前提 configurable:true)
            targetObj  新增属性的对象
            key        新增的键名(属性名) 
            desc       对新增属性的描述(对象类型)
                value:         新增属性的属性值
                writable       属性是否可以被修改 (对应键名修改健值) => 默认false
                enumerable     属性是否可以枚举(循环遍历)  => 默认false
                configurable   属性是否可以被重新配置或删除  => 默认false  
       

       Object.defineProperties(targetObj,params)
            targetObj  新增属性的对象
            params     对象参数,包含新增的属性和属性的秒数{key:desc}
  
  
  
  
   */

    // var zhang = {};

    // 每次新增一个属性到对象中
    // Object.defineProperty(zhang, "name", {
    //     value: "张三",  // 新增属性的属性值
    //     writable: false, // 属性是否可以被修改 (对应键名修改健值) => 默认false
    //     enumerable: false, // 属性是否可以枚举(循环遍历)  => 默认false
    //     configurable: true,  // 属性是否可以被重新配置或删除  => 默认false  
    // })

    // Object.defineProperty(zhang, "age", {
    //     value: 18,  // 新增属性的属性值
    //     writable: false, // 属性是否可以被修改 (对应键名修改健值) => 默认false
    //     enumerable: false, // 属性是否可以枚举(循环遍历)  => 默认false
    //     configurable: false,  // 属性是否可以被重新配置或删除  => 默认  true  
    // })

    // Object.defineProperty(zhang, "height", {
    //     value: "177cm",  // 新增属性的属性值
    //     writable: false, // 属性是否可以被修改 (对应键名修改健值) => 默认false
    //     enumerable: false, // 属性是否可以枚举(循环遍历)  => 默认false
    //     configurable: false,  // 属性是否可以被重新配置或删除  => 默认false  
    // })

    // Object.defineProperty(zhang, "weight", {
    //     value: "65kg",  // 新增属性的属性值
    //     writable: false, // 属性是否可以被修改 (对应键名修改健值) => 默认false
    //     enumerable: false, // 属性是否可以枚举(循环遍历)  => 默认false
    //     configurable: false,  // 属性是否可以被重新配置或删除  => 默认false  
    // })

    // 每次新增一个或多个属性到对象中
    // Object.defineProperties(zhang, {
    //     name: {
    //         value: "张三",  // 新增属性的属性值
    //         writable: false, // 属性是否可以被修改 (对应键名修改健值) => 默认false
    //         enumerable: false, // 属性是否可以枚举(循环遍历)  => 默认false
    //         configurable: false,  // 属性是否可以被重新配置或删除  => 默认false  
    //     },
    //     age: {
    //         value: 18,  // 新增属性的属性值
    //         writable: false, // 属性是否可以被修改 (对应键名修改健值) => 默认false
    //         enumerable: false, // 属性是否可以枚举(循环遍历)  => 默认false
    //         configurable: false,  // 属性是否可以被重新配置或删除  => 默认false  
    //     },
    //     height: {
    //         value: "177cm",  // 新增属性的属性值
    //         writable: false, // 属性是否可以被修改 (对应键名修改健值) => 默认false
    //         enumerable: false, // 属性是否可以枚举(循环遍历)  => 默认false
    //         configurable: false,  // 属性是否可以被重新配置或删除  => 默认false  
    //     },
    //     weight: {
    //         value: "65kg",  // 新增属性的属性值
    //         writable: false, // 属性是否可以被修改 (对应键名修改健值) => 默认false
    //         enumerable: false, // 属性是否可以枚举(循环遍历)  => 默认false
    //         configurable: false,  // 属性是否可以被重新配置或删除  => 默认false  
    //     }
    // })

    // zhang.name = "李四";
    // console.log(delete zhang.height);;

    // for (var key in zhang) {
    //     console.log(key);
    // }

    // console.log(zhang);


    // Object.getOwnPropertyDescriptor(targetObj,key);   获取对象中某个属性的描述(desc)
    // Object.getOwnPropertyDescriptors(targetObj);      获取对象中所有属性的描述(desc)


    // var result = Object.getOwnPropertyDescriptor(zhang,"name");
    // console.log(result);

    var result = Object.getOwnPropertyDescriptors(zhang);
    console.log(result);



    // 字符串为什么不能对应下标赋值?
    // var str = new String("hello");
    // console.log(str);


    // var result = Object.getOwnPropertyDescriptors(str);
    // console.log(result);





</script>

</html>